﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Подключение модуля
    /// </summary>
    public class UseElement : SyntaxTreeElement
    {
        private List<IdElement> names;
        private ConstExpressionElement uin;
        private SyntaxTreeLink treeroot;

        /// <summary>
        /// Составное имя модуля
        /// </summary>
        public List<IdElement> Names { get { return names; } set { names = value; } }

        /// <summary>
        /// Путь до модуля
        /// </summary>
        public ConstExpressionElement In { get { return uin; } set { uin = value; } }

        /// <summary>
        /// Ссылка на корень синтаксического дерева, соответствующего модулю
        /// </summary>
        public SyntaxTreeLink TreeRoot { get { return treeroot; } set { treeroot = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Names">составное имя модуля</param>
        /// <param name="In">путь до модуля</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        /// <param name="TreeRoot">ссылка на корень синтаксического дерева, соответствующего модулю</param>
        public UseElement(List<IdElement> Names, ConstExpressionElement In, List<TokenInfo> Comments, SyntaxTreeLink TreeRoot)
            : base(Names[0].Id, Comments)
        {
            names = Names;
            uin = In;
            treeroot = TreeRoot;
        }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Names">составное имя модуля</param>
        /// <param name="In">путь до модуля</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public UseElement(List<IdElement> Names, ConstExpressionElement In, List<TokenInfo> Comments) : this(Names, In, Comments, null) { }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            string result = names.Join("."); ;
            if (uin != null)
                result += string.Format(" in {0}", uin);
            return result;
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            foreach (IdElement name in names)
                yield return name;
            if (uin != null)
                yield return uin;
            if ((treeroot != null) && (treeroot.Root != null) && (!treeroot.Root.Analysed))
            {
                treeroot.Root.Analysed = true;
                yield return treeroot.Root;
            }
        }
    }
}
